package top.fwpsl.script.base

/**
  *
  * @author 风戏fw
  * @date 2020/11/25
  */
object ForDemo {

  /**
    * for循环语法结构：for (i <- 表达式/数组/集合)
    * to,until都表示范围，二者有何区别？
    * to为包含上限的闭区间，如：1 to 3,Range为1,2,3;
    * until不包含上限，如：1 until 3, Range为1,2
    * 在需要使用从0到n-1的区间时，可以使用until方法。
    *
    *
    * 说明：在for循环的变量之前并没有val或var的指定。该变量的类型是集合的元素类型。循环变量的作用域一直持续到循环结束。
    * 在Scala中，对循环的使用并不如其他语言那么频繁。通常我们可以通过对序列中的所有值应用某个函数的方式来处理它们，
    *  > 而完成这项工作只需要一次方法调用即可。
    *
    * 说明：Scala并没有提供break或continue语句来退出循环。那么如果需要break时我们该怎么做呢，有如下几个选择：
    * 1、使用Boolean型的控制变量；
    * 2、使用嵌套函数--你可以从函数当中return;
    * 3、使用Breaks对象中的break方法
    *
    * {}和()对于for表达式来说都可以。for 推导式有一个不成文的约定：当for 推导式仅包含单一表达式时使用原括号，
    * > 当其包含多个表达式时使用大括号。
    *
    */

  def main(args: Array[String]) {
    println("main方法开始>>>>>>>>>>>>>")
    // for(i <- 表达式),表达式1 to 10返回一个Range（区间）
    // 每次循环将区间中的一个值赋给i
    for (i <- 1 to 10)
      println(i)

    println("-------------")

    for (i <- 1 until 10)
      println(i)

    println("-------------")

    // 定义一个Range，步长是-1，前闭后开区间
    for (i <- Range(10,1,-1))
      println(i)

    println("-------------")

    // 使用reverse
    for (i <- (1 to 10 ).reverse)
      println(i)

    println("-------------")

    // for(i <- 数组)
    val arry = Array("a", "b", "c")
    // i是数组的元素，不是下标
    for (i <- arry)
      println(i)

    println("-------------")

    // 使用下标遍历数组，j是下标，arry(j) 使用小括号下标获取数组元素
    for(j <- 0 until(arry.length))
      println(arry(j))

    println("-------------")

    // 输出1到10之间的偶数
    for(i <- 1 to 10){
      if(i%2 ==0)
        println(i)
    }

    println("main方法结束>>>>>>>>>>>>>")
  }

  println("开始>>>>>>>>>>>>>")
  // 引入保护式_守卫（也称条件判断式）保护式满足为true则进入循环内部，满足为false则跳过，类似于continue
  // 每个生成器都可以带一个条件，注意：if前面没有分号
  for(i <- 1 to 10 if i%2 == 0) println(i)

  println("-------------")

  // 引入变量 注意： j前面有分号
  for(i <- 1 to 3; j = 4 - i) {
    print(j + " ")
  }
  println()

  println("-------------")

  //高级for循环
  //每个生成器都可以带一个条件，注意：if前面没有分号 j前面有分号
  for(i <- 1 to 3; j <- 1 to 3 if i != j)
    print((10 * i + j) + " ")
  println()

  println("-------------")

  for(i <- 1 to 9; j <- 1 to i) {
    print(i+"*"+j+"="+i*j)
    if (j == 1)
      println()
    else
      print("\t")
  }
  println()

  //for推导式：如果for循环的循环体以yield开始，则该循环会构建出一个集合
  //每次迭代生成集合中的一个值
  val v = for (i <- 1 to 10) yield i * 10
  println(v)

  println("-------------")

  //下面两种有什么区别
  val v1 = for (i <- 1 to 10) yield if(i %2 ==0 ) i
  println(v)
  val v2 = for (i <- 1 to 10 if i %2 ==0 ) yield  i
  println(v2)

  println("-------------")

  //可以使用任意多的定义，引入可以在循环中使用的变量
  for(i <- 1 to 3; from = 4 - i; j <- from to 3) {
    print((10 * i + j) + " ");
  }

  println("-------------")

  //输出九九乘法表
  for(i <- 1 to 9){
    for(j <- 1 to i){
      print(i+"*"+j+"="+i*j+"\t")
    }
    println()
  }

  println("结束>>>>>>>>>>>>>")
}

////需要导入包
//import scala.util.control.Breaks._
//breakable {
//  for (...) {
//  if (...) break; //退出breakable块
//  ...
//}
//}
//  //continue例子
//  for (i <- 1 to 10) {
//  breakable{
//  if (i == 2) break//当执行break()这个语句的时候，调到breakable位置开始执行，breakable代码块将被跳过
//  println(i)
//}
//}
//
//  //break例子
//  breakable{
//  for(i<-1 to 10){
//  if(i==5){
//  break
//}
//  println(i)
//}
//}
//
//  //retrun
//  for(i <- 1 to 10){
//  if(i==2) return
//  println(i)
//}
//}

